﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ClinicaDentalApp.Models.Base;
using ClinicaDentalApp.Models.Ficha;
using ClinicaDentalApp.Models.Horas;
using ClinicaDentalApp.Models.PlanDeTratamiento;

namespace ClinicaDentalApp.Controllers
{
    public class PacientesController : Controller
    {
        //
        // GET: /Pacientes/
        PersistenceModelDataContext db = new PersistenceModelDataContext();

        public ActionResult Index()
        {
            return View();
        }

        [HttpGet]
        [Authorize]
        public ActionResult TomaDeHoras()
        {
            IEnumerable<TomaDeHora> tomaHoras;
            //if (fechaHora.HasValue)
            //    tomaHoras = db.TomaDeHoras.Where(t => t.FechaHoraAtencion.Date == fechaHora.Value.Date).OrderByDescending(t => t.FechaHoraAtencion);
            //else
                tomaHoras = db.TomaDeHoras.OrderByDescending(t => t.FechaHoraAtencion);
            return View(tomaHoras);
        }

        [HttpPost]
        [Authorize]
        public ActionResult TomaDeHoras(DateTime? fechaHora)
        {
            IEnumerable<TomaDeHora> tomaHoras;
            if (fechaHora.HasValue)
                tomaHoras = db.TomaDeHoras.Where(t => t.FechaHoraAtencion.Date == fechaHora.Value.Date).OrderByDescending(t => t.FechaHoraAtencion);
            else
                tomaHoras = db.TomaDeHoras.OrderByDescending(t => t.FechaHoraAtencion);
            return View(tomaHoras);
        }

        [HttpGet]
        [Authorize]
        public ActionResult FichasPacientes()
        {
            return View();
        }

        [HttpGet]
        public ActionResult DatosFicha(int Id)
        {
            Cliente cliente = db.Clientes.FirstOrDefault(c => c.Rut == Id);
            FichaInputModel model = new FichaInputModel();
            if (cliente != null)
            {
                model = new FichaInputModel(cliente);
            }
            return View(model);
        }

        [HttpPost]
        public ActionResult DatosFicha(FichaInputModel model)
        {
            Cliente usuario = model.GetCliente();
            if (db.Clientes.FirstOrDefault(c => c.Rut == int.Parse(model.Rut.Replace(".", "").Replace("-", ""))) == null)
            {
                db.Clientes.InsertOnSubmit(usuario);
                db.FichaClinicas.InsertOnSubmit(usuario.FichaClinicas);
            }
            else
            {
                Cliente cliente = db.Clientes.Single(c => c.Rut == int.Parse(model.Rut.Replace(".", "").Replace("-", "")));
                cliente.Direccion = usuario.Direccion;
                cliente.Nombre = usuario.Nombre;
                cliente.Telefono = usuario.Telefono;
            }
            db.SubmitChanges();
            return RedirectToAction("Index", "Home");
        }       

        public ActionResult AutocompleteFichasUsuario(string term)
        {            
                try
                {
                    var list = db.Clientes
                        .Select(h => new
                        {
                            id = h.Rut.ToString().Trim(),
                            value = h.Rut.ToString().Trim() + " - " + h.Nombre.Trim() + " " + h.ApellidoPaterno.Trim() + " " + h.ApellidoMaterno.Trim()
                        });

                    var Lista = list
                        .Where(j => j.value.ToLower().Contains(term.ToLower()))
                        .Select(h => new
                        {
                            id = h.id.ToString(),
                            value = h.value
                        });

                    return this.Json(Lista, JsonRequestBehavior.AllowGet);
                }
                catch (Exception e)
                {
                    return this.Json(new { }, JsonRequestBehavior.AllowGet);
                }
        }
        
        [HttpGet]
        public ActionResult AgregarHora()
        {
            HorasInputModel model = new HorasInputModel();
            return View(model);
        }

        [HttpPost]
        public ActionResult AgregarHora(HorasInputModel model)
        {
            TomaDeHora tomaDeHora = new TomaDeHora();
            tomaDeHora.FechaHoraAtencion = model.hora;
            tomaDeHora.ApellidoMaterno = model.ApellidoMaterno;
            tomaDeHora.ApellidoPaterno = model.ApellidoPaterno;
            tomaDeHora.MotivoConsulta = model.motivoConsulta;
            tomaDeHora.Nombre = model.Nombre;
            tomaDeHora.Rut = int.Parse(model.Rut.Split(new char[]{'-'})[0].Replace(".", ""));
            db.TomaDeHoras.InsertOnSubmit(tomaDeHora);
            db.SubmitChanges();

            return RedirectToAction("TomaDeHoras");
        }

        public ActionResult eliminarHora(int Id)
        {
            TomaDeHora tomahora = db.TomaDeHoras.FirstOrDefault(t => t.Id == Id);
            db.TomaDeHoras.DeleteOnSubmit(tomahora);
            db.SubmitChanges();
            return RedirectToAction("TomaDeHoras");
        }

        public ActionResult AutocompleteTomaHoras(string term)
        {
            try
            {
                var list = db.TomaDeHoras
                    .Select(h => new
                    {
                        id = h.Id.ToString().Trim(),
                        value = h.Rut.ToString().Trim() + " - " + h.Nombre.Trim() + " " + h.ApellidoPaterno + " " + h.ApellidoMaterno
                    });

                var Lista = list
                    .Where(j => j.value.ToLower().Contains(term.ToLower()))
                    .Select(h => new
                    {
                        id = h.id.ToString(),
                        value = h.value
                    });

                return this.Json(Lista, JsonRequestBehavior.AllowGet);
            }
            catch (Exception e)
            {
                return this.Json(new { }, JsonRequestBehavior.AllowGet);
            }
        }

        [Authorize]
        [HttpGet]
        public ActionResult TomaDeHorasSingle(int id)
        {
            IEnumerable<TomaDeHora> tomaHoras;
            tomaHoras = db.TomaDeHoras.Where(t => t.Id == id);
            return View("TomaDeHoras",tomaHoras);
        }

        [Authorize]
        [HttpGet]
        public ActionResult PlanDeTratamiento()
        {
            return View();
        }

        public ActionResult PlanDeTratamientoClientes(int idCliente)
        {
            Cliente cliente = db.Clientes.FirstOrDefault(c => c.Rut == idCliente);
            if (cliente == null)
                cliente = new Cliente();
            ViewBag.idCliente = cliente.Rut;
            return View(cliente.PlanDeTratamientos);
        }

        public ActionResult AgregarPlanDeTratamiento(int idCliente)
        {
            PlanDeTratamientoModelInput model = new PlanDeTratamientoModelInput();
            model.idCliente = idCliente;
            model.Piezas = db.Piezas;
            return View(model);
        }

        [HttpPost]
        public ActionResult AgregarPlanDeTratamiento(PlanDeTratamientoModelInput model)
        {
            PlanDeTratamiento planTrat = new PlanDeTratamiento();
            planTrat.IdPaciente = model.idCliente;
            planTrat.IdPieza = model.idPieza;
            planTrat.Valor = model.valor;
            planTrat.ValorRebajado = model.valorRebajado;
            planTrat.Accion = model.Accion;

            db.PlanDeTratamientos.InsertOnSubmit(planTrat);
            db.SubmitChanges();

            return RedirectToAction("PlanDeTratamiento");
        }

        public ActionResult SesionASesion(int id)
        {
            PlanDeTratamiento planTrat = db.PlanDeTratamientos.FirstOrDefault(p => p.Id == id);
            ViewBag.Lista = planTrat.PropuestaAccions.ToList();
            return View(planTrat);
        }

        public ActionResult SesionASesionGlobal(int idCliente)
        {
            ViewBag.Paciente = db.Clientes.FirstOrDefault(c => c.Rut == idCliente);
            IEnumerable<PropuestaAccion> propuestas = db.PropuestaAccions.Where(p => p.PlanDeTratamiento.IdPaciente == idCliente);
            return View(propuestas);
        }

        public ActionResult AgregarSesion(int id)
        {
            SesionASessionInputModel model = new SesionASessionInputModel();
            model.IdPlan = id;
            return View(model);
        }

        [HttpPost]
        public ActionResult AgregarSesion(SesionASessionInputModel model)
        {
            PropuestaAccion prop = new PropuestaAccion();
            prop.IdPlanTratamiento = model.IdPlan;
            prop.IdPieza = db.PlanDeTratamientos.Single(p => p.Id == model.IdPlan).IdPieza.Value;
            prop.ValorReal = model.Saldo;
            prop.ValorRebajado = model.Abono;
            prop.Accion = model.AccionClinica;
            prop.FechaRealizacion = model.Fecha;

            db.PropuestaAccions.InsertOnSubmit(prop);

            db.SubmitChanges();

            return RedirectToAction("PlanDeTratamiento");
        }
    }
}
